package server.services;

import java.util.ArrayList;
import java.util.List;

import model.Usuario;
import server.dao.AmigosDAO;
import server.exception.DAOException;
import server.exception.ServiceException;

/**
 * Este objeto encapsula las acciones que pueden realizarse sobre un usuario.
 * Todo aquel que desea obtener algun dato de amigos persistidos deberia
 * pedirselo a esta clase
 * 
 * @author romeroy
 * 
 */
public class AmigosService {
	private static AmigosDAO DAO;
	
	public AmigosService(){
		if(AmigosService.DAO == null)
			AmigosService.DAO = new AmigosDAO();
	}
	
	/**
	 * Obtiene una lista con los amigos de un usuario esten o no conectados
	 * 
	 * @param usuario
	 *            Usuario del cual se desea saber sus amistades
	 * @return Lista con los amigos del usuario
	 * @throws ServiceException
	 *             en caso de que no se pueda completar la accion
	 * @throws Exception 
	 */
	public List<Usuario> amigosDe(Usuario usuario) throws Exception {
		return amigosDe(usuario, false);
	}

	/**
	 * Obtiene una lista con los amigos de un usuario y se puede especificar si
	 * estos amigos deben estar conectados o no
	 * 
	 * @param usuario
	 *            Usuario del cual se desean saber sus amistades
	 * @param conectados
	 *            Indica si se deben traer solo los amigos conectados o no
	 * @return Lista de amigos de un usuario
	 * @throws ServiceException
	 *             en caso de que no se pueda completar la accion
	 * @throws DAOException 
	 */
	public List<Usuario> amigosDe(Usuario usuario, boolean conectados)
			throws ServiceException, DAOException {
		return DAO.amigosDe(usuario);
	}

	/**
	 * Bloquea una amistad entre 2 usuarios
	 * 
	 * @param bloqueador
	 *            Usuario que bloquea la amistad
	 * @param bloqueado
	 *            Usuario que sera bloqueado
	 * @return verdadero en caso de exito, falso en caso contrario
	 * @throws ServiceException
	 *             en caso de que no se pueda completar la accion
	 */
	public boolean bloquear(Usuario bloqueado,Usuario bloqueador)	throws ServiceException {
		try {
			return DAO.bloquear(bloqueador, bloqueado);
		} catch (DAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * Elimina una amistad entre 2 usuarios
	 * 
	 * @param eliminador
	 *            Usuario que quiere eliminar la amistad
	 * @param eliminado
	 *            Usuario victima de la eliminacion
	 * @return verdadero en caso de exito, falso en caso contrario
	 * @throws ServiceException
	 *             en caso de que no se pueda completar la accion
	 * @throws DAOException 
	 */
	public boolean eliminar(Usuario eliminador, Usuario eliminado)
			throws Exception {
		return DAO.eliminar(eliminador, eliminado);
	}

	/**
	 * 
	 * @param usuario
	 * @param otroUsuario
	 * @return
	 */
	public ArrayList<Usuario> amigosEnComun(Usuario usuario, Usuario otroUsuario) {
		try {
			return DAO.amigosEnComun(usuario, otroUsuario);
		} catch (DAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public void aceptarSolicitudDeAmistad(Usuario invitadorUserCompleto,
			Usuario invitado) throws DAOException {
		DAO.aceptarSolicitudDeAmistad(invitadorUserCompleto,invitado);
	}
}
